a20f7753f3f66069b716eb0d4fea28364ecb77f2,tests/frontend/org/voltdb/regressionsuites/TestAdHocPlannerCache.java,TestAdHocPlannerCache,testAdvancedBadParameters,#,366

Before Change



        client.callProcedure("R1.insert", 1, "foo1", 0, 1.1);
        client.callProcedure("R1.insert", 2, "foo2", 0, 2.2);
        client.callProcedure("R1.insert", 3, "foo3", 1, 3.3);

        // UNION
        // parameters in both
        sql = "SELECT ID FROM R1 B WHERE B.ID > ? UNION SELECT ID FROM R1 C WHERE C.ID > ?;";
        vt = client.callProcedure("@AdHoc", sql, 0, 0).getResults()[0];
        assertEquals(3, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS1);

        verifyAdHocFails(client, String.format(pattern, 2, 1), sql, 0);
        checkPlannerCache(client, CACHE_MISS1);

        vt = client.callProcedure("@AdHoc", sql, 1, 2).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        verifyAdHocFails(client, String.format(pattern, 2, 3), sql, 0, 1, 2);
        checkPlannerCache(client, CACHE_MISS1);

        // parameters on right
        sql = "SELECT ID FROM R1 B WHERE NUM = 0 UNION SELECT ID FROM R1 C WHERE C.ID < ?;";
        verifyAdHocFails(client, String.format(pattern, 1, 0), sql);
        checkPlannerCache(client, CACHE_MISS1);

        verifyAdHocFails(client, String.format(pattern, 1, 2), sql, 0, 0);
        checkPlannerCache(client, CACHE_MISS1);

        vt = client.callProcedure("@AdHoc", sql, 2).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS1);

        vt = client.callProcedure("@AdHoc", sql, 3).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        // parameters on left
        sql = "SELECT ID FROM R1 B WHERE NUM > ? UNION SELECT ID FROM R1 C WHERE C.ID > 1;";
        vt = client.callProcedure("@AdHoc", sql, 0).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS1);

        vt = client.callProcedure("@AdHoc", sql, -1).getResults()[0];
        assertEquals(3, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        verifyAdHocFails(client, String.format(pattern, 1, 2), sql, 0, 0);
        checkPlannerCache(client, CACHE_MISS1);

        verifyAdHocFails(client, String.format(pattern, 1, 0), sql);
        checkPlannerCache(client, CACHE_MISS1);

        //
        // Subquery should not make a difference here, but add some tests to make sure at least

After Change


        checkPlannerCache(client, CACHE_MISS1);
    }

    public void subtest4AdvancedBadParameters(Client client) throws IOException, ProcCallException {
        System.out.println("subtest4AdvancedBadParameters...");

        String sql;
        VoltTable vt;

        // UNION
        // parameters in both
        sql = "SELECT ID FROM R1 sub4_B WHERE ID > ? UNION SELECT ID FROM R1 sub4_C WHERE ID > ?;";
        vt = client.callProcedure("@AdHoc", sql, 0, 0).getResults()[0];
        assertEquals(3, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS2);

        verifyAdHocFails(client, String.format(pattern, 2, 1), sql, 0);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        vt = client.callProcedure("@AdHoc", sql, 1, 2).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        verifyAdHocFails(client, String.format(pattern, 2, 3), sql, 0, 1, 2);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        // parameters on right
        sql = "SELECT ID FROM R1 sub4_B WHERE NUM = 0 UNION SELECT ID FROM R1 sub4_C WHERE ID < ?;";
        verifyAdHocFails(client, String.format(pattern, 1, 0), sql);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        verifyAdHocFails(client, String.format(pattern, 1, 2), sql, 0, 0);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        vt = client.callProcedure("@AdHoc", sql, 2).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS2);

        vt = client.callProcedure("@AdHoc", sql, 3).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        // parameters on left
        sql = "SELECT ID FROM R1 sub4_B WHERE NUM > ? UNION SELECT ID FROM R1 sub4_C WHERE ID > 1;";
        vt = client.callProcedure("@AdHoc", sql, 0).getResults()[0];
        assertEquals(2, vt.getRowCount());
        checkPlannerCache(client, CACHE_MISS2);

        vt = client.callProcedure("@AdHoc", sql, -1).getResults()[0];
        assertEquals(3, vt.getRowCount());
        checkPlannerCache(client, CACHE_HIT2);

        verifyAdHocFails(client, String.format(pattern, 1, 2), sql, 0, 0);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        verifyAdHocFails(client, String.format(pattern, 1, 0), sql);
        checkPlannerCache(client, CACHE_PARAMS_EXCEPTION);

        //
        // Subquery should not make a difference here, but add some tests to make sure at least
        //

        // IN subquery
        sql = "SELECT ID FROM R1 sub4 WHERE ID > ? and ID IN (SELECT ID FROM R1 where id > ?) order by ID;";
        vt = client.callProcedure("@AdHoc", sql, 1, 2).getResults()[0];
        validateTableOfScalarLongs(vt, new long[]{3});
        checkPlannerCache(client, CACHE_MISS2);

        vt = client.callProcedure("@AdHoc", sql, 0, 1).getResults()[0];
        validateTableOfScalarLongs(vt, new long[]{2, 3});